#pragma once 

#include<iostream>
#include<string>
#include<vector>


class Command
{
private:
    bool IsSafe(const std::string& cmd)
    {
        for(auto& str : _command_white_list)
        {
            if(cmd==str)
            {
                return true;
            }
        }
        return false;
    }
public:
    Command()
    {
        _command_white_list.push_back("ls -a -l");
        _command_white_list.push_back("whoami");
        _command_white_list.push_back("tree");
        _command_white_list.push_back("pwd");
    }
    std::string Exec(const std::string& cmd)
    {
        if(!IsSafe(cmd)) return "服务器暂停运行……";

        std::string result;
        //popen ，会自动执行命令，将执行结果放入文件之中，并返回这个文件的FILE
        FILE* fp = popen(cmd.c_str() , "r");
        if(fp == NULL)
        {
            result += " exec error";
        }
        else
        {
            //执行成功，读取文件fp 中的每一行数据，拼接到result 上
            char buffer[1024];
            while(fgets(buffer , sizeof(buffer) , fp))//fgets 会返回读取到的字符串
            {
                result += buffer;
            }
            pclose(fp);
        }
        return result;
    }
    ~Command()
    {}
private:
    std::vector<std::string> _command_white_list;
};